package progress.exa8;

public class GenericWildcard {
    public static void main(String[] args) {
        // 创建一个存储类型为Manager的ArrayList对象
        ArrayList<Manager> list = new ArrayList<>();
        // 添加元素
        list.add(new Manager());
        // 创建一个存储类型为Employee的ArrayList对象
        ArrayList<Employee> list1 = new ArrayList<>();
        // 添加元素
        list1.add(new Employee());
        list1.addAll(list);//这个是可以的，因为Manager继承了Employee, Employee是父类，它可以接住子类
        list.addAll(list1);//这个就不行了，Manager类型是子类，它不能接住父类型的对象
        list.value[0].sysoutI();//这个就不行了
        //这里定义list3存放Manage类
        ArrayList<Manager> list3 = new ArrayList<>();
        // 这里由于泛型机制，在编译器就发现了错误
        //list3.addAll1(list1);
    }
}

/**
 * 自定义泛型ArrayList数组
 * @param <E>
 */
class ArrayList <E> {
    /**
     * 存储对象的数组
     */
    E[] value;

    /**
     * 当前元素数量
     */
    int size;

    /**
     * 构造方法
     * 默认构造一个长度为10的对象数组
     */
    public ArrayList(){
        value = (E[]) new Object[10];
    }

    /**
     * 向数组中添加元素
     * @param e
     */
    public void add(E e){
        value[size++] = e;
    }

    /**
     * 将
     * @param list
     * @return
     */
    public ArrayList<E> addAll(ArrayList<?> list){
        for(int i=0;i<size;i++){
            value[i] = (E)list.value[i];
        }
        return this;
    }

    /**
     * 这里限制了入参的类型, 至接受接的主的元素集, 即是E或其子类
     * @param list
     * @return
     */
    public ArrayList<E> addAll1(ArrayList<? extends E> list) {
        for(int i=0;i<size;i++){
            value[i] = (E)list.value[i];
        }
        return this;
    }
}

/**
 * 定义Employee类
 */
class Employee {
    private final int i = 100;
    public void sysoutI(){
        System.out.println(i);
    }
}

/**
 * 定义Manager类基础Employee类
 */
class Manager extends Employee {

}